//
//  HomeTableViewController.swift
//  GZWeibo
//
//  Created by Apple on 15/9/21.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit
import SVProgressHUD

/// 表格的可重用标示符
let WBHomeNormalCellID = "WBHomeNormalCellID"

class HomeTableViewController: BaseTableViewController {

    // 定义一个微博列表的视图模型属性
    lazy var listViewModel = StatusListViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        if !UserAccountViewModel.sharedAccountViewModel.userLogon {
            // 如果用户登录成功，visitorView == nil，不会调用后面的方法！
            visitorView?.setupInfo(nil, title: "关注一些人，回这里看看有什么惊喜")
            return
        }
        
        prepareTableView()
        loadData()
    }
    
    /// 准备表格属性 - 不要在`主方法`中写碎代码 - 提高代码的可读性
    /// 小方法，就放在主方法的下方或者上方
    private func prepareTableView() {
        // 注册可重用 cell
        tableView.registerClass(StatusCell.self, forCellReuseIdentifier: WBHomeNormalCellID)
        
        // 设置行高 - 如果没有动态修改 cell 的约束的情况，行高计算可以使用以下两个代码
        // 条件：要有一个自上而下设置约束的控件，同时指定`底部`约束
        // *** 注意：如果指定固定行高，或者计算行高，一定不要不要设置底部约束
        // 预估行高 - 要尽量和本身的行高一致
        /**
            如果定义了预估行高，会使用预估行高来计算，行高代理方法调用的少！
        */
        tableView.estimatedRowHeight = 300
        
        // 取消分割线
        tableView.separatorStyle = .None
    }
    
    /// 加载数据
    private func loadData() {
        
        listViewModel.loadStatus { (error) -> () in
            
            if error != nil {
                SVProgressHUD.showInfoWithStatus("您的网路不给力")
                return
            }
            
            // 到此为止已经有数据了
            print(self.listViewModel.statuses)
            // 刷新表格
            self.tableView.reloadData()
        }
    }
}

// MARK: - UITableViewDataSource
// 提示：因为已经遵守过协议，所以不必再次遵守
extension HomeTableViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statuses.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 本方法会调用计算行高的方法
        let cell = tableView.dequeueReusableCellWithIdentifier(WBHomeNormalCellID, forIndexPath: indexPath) as! StatusCell
        
        cell.viewModel = listViewModel.statuses[indexPath.row]
        
        return cell
    }
    
    /**
        --- 没有设置预估行高
    
        * 行高方法调用次数，在不同 Xcode 版本中不一样，苹果一直在优化！
        方法执行顺序
        1. 数据行数
        2. 行高 - 计算所有行高
        3. cell，会再次调用当前行的行高，确认
    
        提问：为什么要算所有行？
        tableView 继承自 scrollView，要滚动，需要 contentSize
    
        --- 设置预估行高
    
        1. 数据行数
        2. cell，会调用当前行的行高
        3. 行高
        
        执行顺序
        1. 数据行数 * 预估行高 -> contentSize -> 保证滚动
        2. 当滚动时，如果一个 cell 要出现之前，会临时计算行高，并且调整 contentSize
    
        * 补充：如果行高是固定的，应该设置 rowHeight 属性，坚决不要实现行高代理方法，会严重影响性能！
    
        在开发中，如果动态计算行高，一定要缓存！
    
        * 行高和`视图模型`有关，不同的视图模型对应拥有一个独立的行高！
    */
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        return listViewModel.statuses[indexPath.row].rowHeight
    }
}
